import { get, post, put, del } from './axios'
import type { ApiResponse, PageQuery } from '../model/common-model'
import type { 
  Project, 
  ProjectCreateRequest, 
  ProjectUpdateRequest, 
  ProjectVersion,
  ProjectVersionUploadRequest,
  ProjectConfig,
  ProjectScript
} from '../model/project-model'

/**
 * 获取项目列表（分页）
 * 支持分页和筛选
 */
export function getProjectList(params: PageQuery & {
  project_type?: string  // 项目类型筛选
  project_status?: string // 项目状态筛选
}): Promise<ApiResponse<Project[]>> {
  return get('/projects/', params)
}

/**
 * 获取项目详情
 * 返回指定ID的项目详情和版本信息
 */
export function getProject(id: number): Promise<ApiResponse<Project>> {
  return get(`/projects/${id}`)
}

/**
 * 创建项目
 */
export function createProject(data: ProjectCreateRequest): Promise<ApiResponse<Project>> {
  return post('/projects/', data)
}

/**
 * 更新项目
 * 只需提供需要更新的字段，未提供的字段保持原值
 */
export function updateProject(data: ProjectUpdateRequest): Promise<ApiResponse<Project>> {
  return put(`/projects/${data.id}`, data)
}

/**
 * 删除项目
 * 删除指定ID的项目及其相关版本信息
 */
export function deleteProject(id: number): Promise<ApiResponse<{success: boolean}>> {
  return del(`/projects/${id}`)
}

/**
 * 上传项目版本
 * 上传指定项目的新版本
 */
export function uploadProjectVersion(projectId: number, data: ProjectVersionUploadRequest): Promise<ApiResponse<ProjectVersion>> {
  const formData = new FormData()
  formData.append('version', data.version)
  
  if (data.notes) {
    formData.append('notes', data.notes)
  }
  
  if (data.config_json) {
    formData.append('config_json', data.config_json)
  }
  
  formData.append('file', data.file)
  
  return post(`/projects/${projectId}/versions`, formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}

/**
 * 创建部署任务
 * @param projectId 项目ID
 * @param versionId 版本ID
 * @param environment 环境
 * @param extraParams 额外参数（如部署路径、部署人等）
 */
export function createDeployment(projectId: number, versionId: number, environment: string, extraParams?: Record<string, any>): Promise<ApiResponse<any>> {
  return post('/deployments/', {
    project_id: projectId,
    version_id: versionId,
    environment,
    ...extraParams
  })
}

/**
 * 获取部署详情
 */
export function getDeploymentDetail(deployId: number): Promise<ApiResponse<any>> {
  return get(`/deployments/${deployId}`)
}

/**
 * 获取部署列表
 */
export function getDeploymentList(params: PageQuery & {
  project_id?: number
  status?: string
}): Promise<ApiResponse<any[]>> {
  return get('/deployments/', params)
}

/**
 * 部署项目
 * 直接部署指定项目到指定环境
 */
export function deployProject(projectId: number | string, environment: string): Promise<ApiResponse<any>> {
  return post('/projects/deploy', {
    project_id: projectId,
    environment
  })
}

/**
 * 获取项目详情
 * 返回指定ID的项目详情和版本信息
 */
export function getProjectDetail(id: number): Promise<ApiResponse<Project>> {
  return get(`/projects/${id}`)
}

/**
 * 获取项目配置列表
 * 返回指定项目ID的所有配置项
 */
export function getProjectConfigs(projectId: number): Promise<ApiResponse<ProjectConfig[]>> {
  return get(`/configs/${projectId}`)
}

/**
 * 创建项目配置项 (旧版API)
 */
export function createProjectConfig(projectId: number, config: ProjectConfig): Promise<ApiResponse<ProjectConfig>> {
  return post(`/configs/${projectId}`, config)
}

/**
 * 创建项目配置项 (新版API)
 * 根据项目ID、模块名称、文件路径创建配置项
 * 使用API路径：/api/v1/configs/{project_id}/{module_name}/{file_path}
 */
export function createProjectConfigV2(
  projectId: number,
  moduleName: string,
  filePath: string,
  config: {
    key: string,
    value: string,
    description?: string
  }
): Promise<ApiResponse<ProjectConfig>> {
  // 注意：axios实例已经配置了/api作为baseURL，并且包含/v1
  // 正确的完整路径应为 /api/v1/configs/{project_id}/{module_name}/{file_path}
  // 所以这里只需要使用 /configs/ 开头的路径
  return post(`/configs/${projectId}/${moduleName}/${filePath}`, config)
}

/**
 * 更新项目配置项（旧版API）
 */
export function updateProjectConfig(projectId: number, configId: number, config: ProjectConfig): Promise<ApiResponse<ProjectConfig>> {
  return put(`/configs/${projectId}/${configId}`, config)
}

/**
 * 更新项目配置项（新版API）
 * 根据项目ID、模块名称、文件路径和配置键更新特定配置
 * 使用API路径：/api/v1/configs/{project_id}/{module_name}/{file_path}/{config_key}
 */
export function updateProjectConfigV2(
  projectId: number,
  moduleName: string,
  filePath: string,
  configKey: string,
  config: {
    value: string,
    description?: string
  }
): Promise<ApiResponse<ProjectConfig>> {
  // axios实例已经配置了baseURL：/api
  // 正确的路径是 /api/v1/configs/...
  // 不要在路径中再添加v1，避免重复
  return put(`/configs/${projectId}/${moduleName}/${filePath}/${configKey}`, config)
}

/**
 * 保存项目配置项
 * 根据项目ID、模块名称、文件路径和配置键保存配置
 * 使用API路径：/api/v1/configs/{project_id}/{module_name}/{file_path}/{config_key}
 */
export function saveProjectConfig(
  projectId: number,
  moduleName: string,
  filePath: string,
  configKey: string,
  config: {
    value: string,
    description?: string
  },
  isUpdate: boolean = false
): Promise<ApiResponse<ProjectConfig>> {
  // 如果是编辑现有配置，使用updateProjectConfigV2
  // 如果是新增配置，使用createProjectConfigV2
  if (isUpdate) {
    return updateProjectConfigV2(projectId, moduleName, filePath, configKey, {
      value: config.value,
      description: config.description
    })
  } else {
    return createProjectConfigV2(projectId, moduleName, filePath, {
      key: configKey,
      value: config.value,
      description: config.description
    })
  }
}

/**
 * 删除项目配置项
 * 根据项目ID、模块名称、文件路径和配置键删除特定配置
 * 使用API路径：/api/v1/configs/{project_id}/{module_name}/{file_path}/{config_key}
 */
export function deleteProjectConfig(
  projectId: number,
  moduleName: string,
  filePath: string,
  configKey: string
): Promise<ApiResponse<{success: boolean}>> {
  // 确保projectId是整数
  const id = Math.floor(Number(projectId))
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  // axios实例已经配置了baseURL：/api/v1
  // 正确的完整路径是 /api/v1/configs/...
  return del(`/configs/${id}/${moduleName}/${filePath}/${configKey}`)
}

/**
 * 删除项目配置项（旧版，通过configId）
 */
export function deleteProjectConfigById(projectId: number, configId: number): Promise<ApiResponse<{success: boolean}>> {
  return del(`/configs/${projectId}/${configId}`)
}

/**
 * 创建项目配置文件
 * 根据项目ID创建一个新的配置文件
 * 使用API路径：/api/v1/config-files/{project_id}/files
 */
export function createProjectConfigFile(
  projectId: number,
  data: {
    file_path: string,
    description?: string
  }
): Promise<ApiResponse<any>> {
  // axios实例已经配置了baseURL：/api
  // 正确的完整路径应为 /api/v1/config-files/{project_id}/files
  // 根据日志显示，请求已经自动添加了v1前缀，这里不需要再手动添加
  const id = Math.floor(Number(projectId))
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  return post(`/config-files/${id}/files`, data)
}

/**
 * 获取项目配置文件列表
 * 根据项目ID获取所有配置文件
 * 使用API路径：/api/v1/config-files/{project_id}/files
 */
export function getProjectConfigFiles(projectId: number): Promise<ApiResponse<any[]>> {
  // 确保projectId是整数
  const id = Math.floor(Number(projectId))
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  // 根据后端日志，请求路径已经添加了v1前缀，所以这里不需要再手动添加/v1
  // 正确的完整路径应该是 /api/v1/config-files/{project_id}/files
  return get(`/config-files/${id}/files`)
}

/**
 * 删除项目配置文件
 * 根据项目ID和文件ID删除特定配置文件
 * 使用API路径：/api/v1/config-files/{project_id}/files/{file_id}
 */
export function deleteProjectConfigFile(projectId: number, fileId: number): Promise<ApiResponse<{success: boolean}>> {
  // 确保projectId和fileId是有效整数
  const id = Math.floor(Number(projectId))
  const fid = Math.floor(Number(fileId))
  
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  
  if (isNaN(fid)) {
    return Promise.reject(new Error('文件ID必须是有效的整数'))
  }
  
  // axios的baseURL已经包含了/api/v1前缀，所以这里不需要手动添加/v1
  // 正确的完整路径是 /api/v1/config-files/{project_id}/files/{file_id}
  return del(`/config-files/${id}/files/${fid}`)
}

/**
 * 获取项目脚本
 * 根据项目ID获取项目的脚本内容
 * 使用API路径：/api/v1/projects/{project_id}/script
 */
export function getProjectScript(projectId: number): Promise<ApiResponse<ProjectScript>> {
  // 确保projectId是整数
  const id = Math.floor(Number(projectId))
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  return get(`/projects/${id}/script`)
}

/**
 * 更新项目脚本
 * 根据项目ID更新项目的脚本内容
 * 使用API路径：/api/v1/projects/{project_id}/script
 */
export function updateProjectScript(projectId: number, script: string): Promise<ApiResponse<ProjectScript>> {
  // 确保projectId是整数
  const id = Math.floor(Number(projectId))
  if (isNaN(id)) {
    return Promise.reject(new Error('项目ID必须是有效的整数'))
  }
  return put(`/projects/${id}/script`, { content: script })
}
